package com.bit.cfdi.web.services;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import com.bit.cfdi.web.dao.ClienteDAO;
import com.bit.cfdi.web.domain.Cliente;
import com.bit.cfdi.web.domain.DBConstants;
import com.bit.cfdi.web.domain.Negocio;

@Service
public class ClienteService {

	@Autowired ClienteDAO clienteDAO;
	
	public void save(final Cliente cliente) throws DataAccessException {
		cliente.setStatus(DBConstants.STATUS_ACTIVE);
		clienteDAO.save(cliente);
	}

	public List<Cliente> getAll() throws DataAccessException {
		return clienteDAO.getAll();
	}

	public Cliente getClienteByNameAndRFC(final String name, final String rfc, String nombreEmpresa) throws DataAccessException {
		return clienteDAO.getClienteByNameAndRFC(name, rfc, nombreEmpresa);
	}

	public List<Cliente> getAllfromNegocio(final Negocio negocio) throws DataAccessException {
		return clienteDAO.getAllfromNegocio(negocio);
	}

	public void delete(final Cliente cliente) throws DataAccessException {
		cliente.setStatus(DBConstants.STATUS_DELETED);
		clienteDAO.save(cliente);
	}

	public List<Long> getMostPurchasedItemsInTime(
			final Cliente cliente,final Calendar initDate, 
			final Calendar finalDate) throws DataAccessException {
			return clienteDAO.getMostPurchasedItemsInTime(cliente, initDate, 
					finalDate);
	}

	public Map<Long, Double> getTotalSalesInTime(final Cliente cliente, 
			final Calendar initDate, final Calendar finalDate) throws DataAccessException {
		return clienteDAO.getTotalSalesInTime(cliente, initDate, finalDate);
	}

	public Map<Long, Double> getTotalSalesInTimeByCategory(final Cliente cliente,
			final String category, final Calendar initDate, 
			final Calendar finalDate) throws DataAccessException {
		return clienteDAO.getTotalSalesInTimeByCategory(cliente, category, 
				initDate, finalDate);
	}

	public List<Cliente> searchCustumersByAllFields(final Negocio neg, 
			final String toSearch) throws DataAccessException {
		return clienteDAO.searchCustumersByAllFields(neg, toSearch);
	}

	public List<Cliente> searchByRfc(String rfc) throws DataAccessException {
		return null;
	}

	public ArrayList<Object> getClientesByRFCLike(String rfcLike, Negocio negocio) throws DataAccessException {
		return clienteDAO.getClientesByRFCLike(rfcLike, negocio);		
	}

	public Cliente getClienteByRFC(String rfc) throws DataAccessException {
		return clienteDAO.getClienteByRFC(rfc);
	}

	public Cliente getClienteByName(String name) throws DataAccessException {
		return clienteDAO.getClienteByName(name);
	}

	public ArrayList<Object> getClienteByNameLike(String nameLike, Negocio negocio) throws DataAccessException {		
		return clienteDAO.getClientesByNameLike(nameLike, negocio);
	}

	public Cliente getClienteByNegocioAndRFC(final Long idNegocio, final String rfc) throws DataAccessException {
		return clienteDAO.getClienteByNegocioAndRFC(idNegocio, rfc);
	}

	public Cliente getLastClienteSaved(Negocio negocio) throws DataAccessException {
		return clienteDAO.getLastInsertedCliente(negocio);
	}

	public List<Cliente> searchClienteRFCRazon(final Negocio neg, 
			final String rfc, final String razon) throws DataAccessException {
		return clienteDAO.searchClienteRFCRazon(neg, rfc, razon);
	}
	
	public Cliente getClienteByRfcNegocio(String rfc, Negocio negocio) throws DataAccessException {
		return clienteDAO.getClienteByRfcNegocio(rfc, negocio);
	}

}
